//  如果参数是一个对象，就会调用该对象的 toString 方法，将其转为字符串，然后才生成一个 Symbol 值。
Symbol([1, 2, 3]) // symbol(1,2,3)
Symbol({ a: 1 }) // Symbol([object Object])

//  值也可以转为布尔值 , 但好像都是 true
Boolean(Symbol(false)) // true

//  Symbol.prototype.description 可以返回创建时的入参调用 toString 返回的值，俗称描述符
Symbol([1, 2, 3]).description // 1,2,3

// Symbol.for() 返回全局已存在以该参数为symbol的描述符的值，不存在该描述符则新增（登录）, Symbol.for创建会挂载到全局，Symbol则不会
Symbol.for('foo') === Symbol.for('foo') // true
Symbol('foo') === Symbol.for('foo') // false
Symbol('foo') === Symbol('foo') // false

// Symbol.keyFor() 返回一个已全局登录 symbol 的描述符
Symbol.keyFor(Symbol.for('foo')) // "foo"
Symbol.keyFor(Symbol('foo')) // undefined

var c = Symbol('c')
var obj = {
	a: 'something',
	b: 20,
	[c]: 40,
}
obj.__proto__[Symbol('a')] = function () {}

// TODO 不能遍历出symbol属性，可以遍历出原型链可枚举属性
for (const key in obj) {
	console.log(key)
}

// TODO 返回自身的symbol属性
console.log(Object.getOwnPropertySymbols(obj))

// TODO 返回自身所有属性，包括symbol，不包括原型链上的
console.log(Reflect.ownKeys(obj))
